Перейти к основному содержимому

2.01. Справочник по Linux

Разработчику Архитектору Инженеру

Справочник по Linux

📘 Ядро и параметры системы

1. Параметры загрузки ядра (/proc/cmdline, grub.cfg)

Командная строка ядра задаёт поведение во время инициализации. Примеры:

ПараметрЗначение / ОписаниеКонтекст
root=Устройство корневой ФС (/dev/sda2, UUID=…, LABEL=…, PARTUUID=…)Обязателен (если не initramfs динамически определит)
ro / rwМонтирование корневой ФС только для чтения / для чтения и записиИспользуется при загрузке с ro, затем mount -o remount,rw /
init=Путь к первому пользовательскому процессу (по умолчанию /sbin/init)Для отладки (init=/bin/bash)
systemd.unit=Целевой юнит systemd (rescue.target, multi-user.target, graphical.target)Альтернатива single, 3, 5
quietПодавление вывода ядра (кроме ошибок)Используется в дистрибутивах по умолчанию
loglevel=NУровень логирования (07: от emerg до debug)Например, loglevel=7 для отладки
console=Устройство консоли (ttyS0,115200n8, tty0)Серверы — ttyS0; десктопы — tty1
acpi=Управление ACPI (off, ht, strict, noirq, force)Для проблем с питанием/железом
noapic, nolapicОтключение APIC/LAPICРедко, при несовместимости аппаратуры
iommu=Управление IOMMU (off, force, pt)Виртуализация, пассинг устройств
intel_iommu=on/off, amd_iommu=on/offВключение/выключение IOMMU на конкретных CPU
net.ifnames=0Отключение предсказуемых имён интерфейсов → eth0, wlan0Совместимость со скриптами
ipv6.disable=1Полное отключение IPv6 в ядреБез sysctl (тот лишь деактивирует стек)
rd.lvm.lv=LVM-логические тома для initramfs (rd.lvm.lv=vg0/root)Используется при загрузке с LVM
rd.luks.uuid=, rd.luks.name=Параметры LUKS-шифрования дисковДля initramfs с шифрованием
debugВключает earlyprintk, ignore_loglevel, может добавить dyndbgТолько для отладки
slub_debug=FZPUОтладка SLUB-аллокатора (F — free list check, Z — zeroing, P — poisoning, U — sanity checks)Диагностика утечек/коррупции
panic=NЗадержка (с) перед автоматическим ребутом после паники0 — виснуть; -1 — немедленный ребут
oops=panicЛюбая oops → kernel panicДля строгого контроля
spectre_v2=, mds=, tsx=, l1tf=Управление mitigations против аппаратных уязвимостейПример: spectre_v2=off (опасно!)
efi=Поведение EFI (nochunk, runtime, disable_early_pci_dma)Диагностика/безопасность на UEFI
nomodesetНе загружать DRM/KMS-драйверы графикиПри проблемах с драйверами GPU

⚠️ Многие параметры имеют побочные эффекты (например, отключение mitigations → уязвимости). Применяйте осознанно.


2. /proc — procfs: интерфейс к ядру в реальном времени

2.1 Общесистемные файлы (/proc/)

ФайлОписаниеПримеры значений / структуры
/proc/versionВерсия ядра + компиляторLinux version 6.8.0-45-generic (buildd@lcy02-amd64-001) (gcc-13, GNU ld (GNU Binutils for Ubuntu) 2.42) #45-Ubuntu SMP PREEMPT_DYNAMIC Tue Oct 1 14:25:59 UTC 2024
/proc/cmdlineТекущая командная строка ядраBOOT_IMAGE=/vmlinuz-6.8.0-45-generic root=UUID=… ro quiet splash
/proc/cpuinfoИнформация о CPUprocessor, vendor_id, model name, cpu MHz, cache size, flags (sse, avx, ssse3, …), bugs (cpu_meltdown, spectre_v1/v2)
/proc/meminfoИнформация о памятиMemTotal, MemFree, Buffers, Cached, SwapTotal, SwapFree, MemAvailable, Active, Inactive, Shmem, Slab, SReclaimable, SUnreclaim
/proc/loadavgСредняя загрузка (1/5/15 мин), running/total threads, последний pid1.23 0.98 0.76 2/2567 12345
/proc/uptimeВремя работы системы (сек), время простоя (сек)123456.78 98765.43
/proc/statАгрегированная статистика CPU, дисков, прерыванийcpu user nice system idle iowait irq softirq steal guest guest_nice и intr, ctxt, btime, processes, procs_running, procs_blocked
/proc/interruptsСтатистика прерываний по CPU и устройствам0: 12345678 IO-APIC 2-edge timer
/proc/filesystemsПоддерживаемые ФС (nodev — псевдо-ФС)nodev sysfs, ext4, xfs, btrfs, fuseblk, zfs
/proc/mounts / self/mountsТекущие точки монтирования (в формате /etc/mtab)/dev/sda2 / ext4 rw,relatime 0 0
/proc/swapsИнформация о swap-разделах/файлах/swapfile file 2147479552 1048576 -1
/proc/partitionsСписок блочных устройств и их размеры (в 1K блоках)8 0 125034840 sda, 8 1 1048576 sda1
/proc/devicesСписок major-номеров блочных и символьных устройств1 mem, 4 /dev/vc/0, 252 zfs, 259 blkext
/proc/diskstatsДетальная статистика дисков (чтения/записи/время)8 0 sda 12345 0 987654 1234 5678 0 987654 5678 0 1234 6890
/proc/vmstatСтатистика управления памятьюpgpgin, pgpgout, pswpin, pswpout, pgalloc_*, pgfree, pgactivate, pgdeactivate, pgfault, pgmajfault, compact_*, unevictable_*
/proc/sys/Интерфейс sysctl (см. ниже)
/proc/kallsymsАдреса и имена символов ядра (требует CAP_SYSLOG)ffffffff81000000 T _text, ffffffffc0000000 t my_module_init [my_module]
/proc/modulesЗагруженные модули ядраnvidia 34567890 42 - Live 0xffffffffc0000000 (POE)
/proc/consolesДоступные консолиtty0 -W- (E) 4:7, ttyS0 -WU (E) 4:64
/proc/buddyinfoСостояние buddy-аллокатора (свободные страницы по order)Node 0, zone DMA 1 2 1 …
/proc/zoneinfoДетали зон памяти (DMA, DMA32, Normal)Node 0, zone DMA pages free:123 min:45 low:56 high:67 …
/proc/slabinfoИнформация о SLAB/SLOB/SLUB кэшахkmalloc-192 123456 123456 192 21 1 : tunables 0 0 0 : slabdata 5879 5879 0
/proc/locksТекущие файловые блокировки1: POSIX ADVISORY WRITE 1234 00:12:123456 0 EOF
/proc/softirqsСтатистика softirq по CPUNET_RX: 12345678 8765432 …
/proc/timer_list, /proc/timer_statsИнформация о таймерах (timer_stats требует echo 1 > /proc/timer_stats для запуска трассировки)

2.2 Процесс-ориентированные файлы (/proc/<pid>/)

ФайлОписаниеПримечания
cmdlineАргументы командной строки (разделены \0)Чтение через tr '\0' ' ' < /proc/123/cmdline
commИмя процесса (до 15 байт, prctl(PR_SET_NAME))
statusОбобщённая информация: Name, Umask, State, Tgid, Ngid, Pid, PPid, TracerPid, Uid, Gid, FDSize, Groups, NStgid, NSpid, NSpgid, NSsid, VmPeak, VmSize, VmLck, VmPin, VmHWM, VmRSS, RssAnon, RssFile, RssShmem, VmData, VmStk, VmExe, VmLib, VmPTE, VmSwap, HugetlbPages, CoreDumping, THP_enabled, Threads, SigQ, SigPnd, ShdPnd, SigBlk, SigIgn, SigCgt, CapInh, CapPrm, CapEff, CapBnd, CapAmb, NoNewPrivs, Seccomp, Speculation_Store_Bypass, Cpus_allowed, Cpus_allowed_list, Mems_allowed, Mems_allowed_list, voluntary_ctxt_switches, nonvoluntary_ctxt_switchesФормат — Key: Value
statСырые данные о состоянии процесса (одна строка, поля через пробел)Используется ps, top; порядок полей строго фиксирован (см. man 5 proc)
statmИнформация о памяти в страницах (size resident shared text lib data dirty)В 4K страницах по умолчанию
mapsТекущие отображённые регионы памяти7f1234560000-7f1234580000 r--p 00000000 08:02 123456 /usr/lib/libc.so.6
smaps / smaps_rollupДетализация maps + статистика использования (Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirty, Referenced, Anonymous, LazyFree, AnonHugePages, ShmemPmdMapped, FilePmdMapped, Shared_Hugetlb, Private_Hugetlb, Swap, SwapPss, Locked)smaps_rollup — агрегировано по процессу
fd/Символические ссылки на открытые дескрипторы0 → /dev/pts/0, 1 → /dev/pts/0, 3 → socket:[123456], 4 → /var/log/app.log
fdinfo/<fd>Информация о конкретном fd (например, pos, flags, mnt_id)
environПеременные окружения (\0-разделённые)
limitsОграничения ulimit для процессаMax cpu time, Max file size, Max data size, Max stack size, Max core file size, Max resident set, Max processes, Max open files, Max locked memory, Max address space, Max file locks, Max pending signals, Max msgqueue size, Max nice priority, Max realtime priority, Max realtime timeout
cgroupИерархии cgroups, в которых состоит процесс0::/user.slice/user-1000.slice/session-1.scope
ns/Пространства имён: mnt, pid, net, uts, ipc, user, cgroup (симв. ссылки на nsfs)ls -l /proc/123/ns/net → 'net:[4026531992]'
syscallТекущий системный вызов (или running, sleeping, stopped)
stackТрассировка стека ядра (только для процесса в ядре; требует CAP_SYS_ADMIN)
wchanИмя функции ядра, в которой спит процессНапример, poll_schedule_timeout
attr/Атрибуты безопасности: current (текущая метка SELinux/AppArmor), exec, fscreate, keycreate, sockcreateТолько при включённых LSM
oom_score, oom_score_adjТекущий скор OOM и коррекция (-1000 — игнорировать, 1000 — макс. шанс убить)echo -1000 > /proc/123/oom_score_adj

3. /sys — sysfs: представление устройств и драйверов

3.1 Общие пути

ПутьОписание
/sys/class/Устройства, сгруппированные по классу (net/, block/, input/, sound/, leds/, backlight/, thermal/, hwmon/, drm/, tty/, vc/, mem/, misc/, bdi/, dma/, scsi_host/, scsi_device/, scsi_disk/, usb/, pci_bus/, и др.)
/sys/devices/Физическая/виртуальная иерархия устройств (шина → устройство → дочерние)
/sys/bus/Шины (pci/, usb/, platform/, acpi/, serio/, virtio/) — с подкаталогами devices/ и drivers/
/sys/firmware/Информация от firmware (efi/, acpi/, dmi/)
/sys/module/Загруженные модули (parameters/, sections/, holders/, notes/)
/sys/kernel/Параметры ядра: mm/, debug/, security/, uevent_helper, profiling, fscaps, kexec_*, kaslr

3.2 Примеры значимых атрибутов

ПутьТипВозможные значенияНазначение
/sys/class/net/<iface>/addressroMAC-адрес (aa:bb:cc:dd:ee:ff)Уникальный идентификатор сетевого интерфейса
/sys/class/net/<iface>/mturwЧисло (обычно 1500)Maximum Transmission Unit
/sys/class/net/<iface>/tx_queue_lenrwЧисло (например, 1000)Длина очереди передачи
/sys/class/net/<iface>/flagsroЧисло в hex (битовая маска)Состояние интерфейса: IFF_UP, IFF_BROADCAST, IFF_RUNNING, IFF_PROMISC, IFF_MULTICAST и др. (ip link show декодирует)
/sys/class/net/<iface>/operstaterounknown, notpresent, down, lowerlayerdown, testing, dormant, upФизическое состояние линка
/sys/class/net/<iface>/carrierro0 / 1Наличие несущей (link beat)
/sys/class/thermal/thermal_zone*/temproТемпература в мК (×1000)Например, 48000 = 48.0°C
/sys/class/thermal/thermal_zone*/typerox86_pkg_temp, cpu-thermal, iwlwifiТип датчика
/sys/class/thermal/thermal_zone*/trip_point_*/temprwПороги (мК)При достижении — триггер (например, cooling)
/sys/class/thermal/thermal_zone*/trip_point_*/typerocritical, hot, passive, activeСтратегия реагирования
/sys/class/hwmon/hwmon*/temp*_inputroТемпература в мКДатчики от hwmon (возможно, дублирует thermal)
/sys/block/<dev>/queue/schedulerrw[mq-deadline] kyber bfq noneПланировщик ввода-вывода
/sys/block/<dev>/queue/nomergesrw0 (мержить), 1 (не мержить соседние), 2 (не мержить вообще)Оптимизация запросов на диск
/sys/block/<dev>/queue/read_ahead_kbrwЧисло КБ (например, 128)Размер read-ahead буфера
/sys/block/<dev>/queue/rotationalro0 (SSD/NVMe), 1 (HDD)Признак вращающегося носителя
/sys/devices/system/cpu/cpu*/onlinerw0 / 1Включение/отключение CPU core
/sys/devices/system/cpu/cpu*/cpufreq/scaling_governorrwperformance, powersave, ondemand, conservative, schedutilУправление частотой CPU
/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freqroЧастота в кГцТекущая частота ядра
/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_min_freq, max_freqroДиапазон частот (кГц)Поддерживаемые частоты
/sys/module/<modname>/parameters/<param>rwЗависит от параметраДинамическая настройка параметров модуля (если поддерживается)

4. sysctl — настройка ядра во время выполнения (/proc/sys/)

Основные категории:

4.1 vm.* — управление виртуальной памятью

ПараметрТипЗначения / Пояснение
vm.swappinessint0100 (по умолчанию 60). Чем выше — охотнее ядро вытесняет анонимную память в swap. 0 — почти никогда (но не отключает swap полностью); 1 — рекомендуется для серверов БД.
vm.vfs_cache_pressureint100 (по умолчанию). Приоритет освобождения dentry/inode кэшей относительно pagecache. >100 — агрессивнее сбрасывать метаданные; <100 — сохранять дольше.
vm.dirty_ratio, vm.dirty_background_ratiointПороговые доли dirty-страниц в процентах от MemFree+Cached. dirty_background_ratio — фоновая запись (pdflush/kworker); dirty_ratio — блокирующая запись. Рекомендуется для SSD: 10 и 5.
vm.dirty_bytes, vm.dirty_background_bytesintАбсолютные значения (в байтах), приоритет над _ratio, если ≠0.
vm.overcommit_memoryint0 — эвристическая оценка (по умолчанию); 1 — разрешить всё (опасно); 2 — строгий учёт (CommitLimit = SwapTotal + MemTotal * overcommit_ratio/100).
vm.overcommit_ratiointПроцент RAM для учёта при overcommit_memory=2 (по умолчанию 50).
vm.admin_reserve_kbytesintМин. объём памяти, резервируемый для root (в КБ). По умолчанию ~3% от RAM.
vm.user_reserve_kbytesintРезерв для обычных пользователей (в КБ). По умолчанию ~3% от RAM.
vm.compact_memorywrite-onlyЗапись 1 → запуск компактификации памяти (дефрагментация для huge pages).
vm.drop_cacheswrite-only1 — pagecache; 2 — dentries+inodes; 3 — всё. Не для продакшена! Только для тестов.
vm.min_free_kbytesintМин. свободной памяти (в КБ) для предотвращения OOM. Слишком мало → thrashing; слишком много → неэффективное использование. Автонастраивается, но можно фиксировать.
vm.zone_reclaim_modeint0 — не пытаться reclaim локально (по умолчанию на NUMA); 1 — reclaim из локальной зоны. Редко меняют.
vm.nr_hugepages, vm.nr_hugepages_mempolicy, vm.hugepages_treat_as_movableУправление huge pages (2MB/1GB). nr_hugepages — желаемое количество.

4.2 net.* — сетевой стек

net.core.*
ПараметрНазначение
net.core.rmem_default, rmem_maxРазмер приёмного буфера сокета по умолчанию / максимум
net.core.wmem_default, wmem_maxТо же для передающего буфера
net.core.optmem_maxМакс. размер опциональных данных (например, SO_TIMESTAMP)
net.core.netdev_max_backlogМакс. длина очереди пакетов, ожидающих обработки сетевым драйвером (до NAPI)
net.core.somaxconnМакс. длина очереди listen() для сокетов (ограничение backlog в listen())
net.core.dev_weight, dev_weight_rx_bias, dev_weight_tx_biasПриоритет обработки RX/TX в NAPI-цикле
net.ipv4.*
ПараметрНазначение
net.ipv4.ip_forward1 — включить маршрутизацию IP; 0 — отключить
net.ipv4.conf.all.forwardingТо же, но для IPv6 также через net.ipv6.conf.all.forwarding
net.ipv4.ip_local_port_rangeДиапазон локальных портов для исходящих соединений (например, 32768 60999)
net.ipv4.tcp_fin_timeoutВремя (с) удержания TIME_WAIT сокета после FIN
net.ipv4.tcp_tw_reuse1 — разрешить переиспользование TIME_WAIT для исходящих соединений (только для клиентских сценариев!)
net.ipv4.tcp_tw_recycleУдалён в ядре ≥4.12 — был небезопасен в NAT. Не использовать.
net.ipv4.tcp_keepalive_time, _intvl, _probesПараметры TCP keepalive (7200, 75, 9 по умолчанию)
net.ipv4.tcp_syn_retries, tcp_synack_retriesКол-во попыток отправки SYN / SYN+ACK
net.ipv4.tcp_syncookies1 — включить SYN cookies при переполнении listen-очереди
net.ipv4.tcp_max_syn_backlogМакс. длина очереди полуоткрытых соединений (SYN_RECV)
net.ipv4.tcp_mem, tcp_rmem, tcp_wmemГлобальные/сокет-специфичные лимиты памяти TCP (min, pressure, max)
net.ipv4.tcp_congestion_controlАлгоритм (cubic, reno, bbr, bbr2, dctcp, westwood)
net.ipv4.tcp_notsent_lowatПорог буфера (байт), ниже которого разрешается send() без блокировки (для TCP_NOTSENT_LOWAT)
net.ipv4.ip_nonlocal_bind1 — разрешить bind() к не-локальному IP (для HAProxy и т.п.)
net.ipv4.ip_local_reserved_portsСписок портов, исключённых из ip_local_port_range (например, 50000-50010)
net.ipv4.neigh.default.gc_thresh1/2/3Пороги GC таблицы соседей (ARP/ND) — минимальный, soft limit, hard limit
net.ipv4.icmp_echo_ignore_all, _broadcastsИгнорировать ping / ping в broadcast
net.ipv6.* — аналогично, с disable, autoconf, use_tempaddr, dad_transmits, max_addresses, accept_ra, forwarding.

4.3 fs.* — файловые системы

ПараметрНазначение
fs.file-maxМакс. число открытых файловых дескрипторов в системе
fs.nr_openМакс. значение ulimit -n для процесса (по умолчанию 1048576)
fs.inotify.max_user_instances, max_user_watches, max_queued_eventsЛимиты на inotify
fs.aio-max-nr, aio-nrАсинхронный I/O: макс. и текущее число операций
fs.protected_symlinks, protected_hardlinks, protected_fifos, protected_regularЗащита от гонок при разыменовании (1 — включить, рекомендуется)

4.4 kernel.* — общие параметры ядра

ПараметрНазначение
kernel.pid_maxМакс. PID (по умолчанию 32768, до 4194304)
kernel.threads-maxМакс. число потоков (ограничено pid_max и ulimit -u)
kernel.shmmax, shmall, shmmni, msgmax, msgmni, msgmnb, semПараметры SysV IPC
kernel.randomize_va_spaceASLR: 0 — off, 1 — partial, 2 — full (по умолчанию)
kernel.core_patternШаблон имени core-дампа (может быть pipe: `
kernel.core_uses_pidДобавлять PID в имя core-файла (1/0)
kernel.dmesg_restrict1 — только root может читать dmesg (/proc/kmsg, syslog())
kernel.perf_event_paranoidУровень доступа к perf_event_open: -1 — все; 0 — только мониторинг; 1 — только текущий процесс; 2 — только CPU-счётчики; 3 — запрет
kernel.unprivileged_bpf_disabled1 — запретить bpf() для не-CAP_BPF
kernel.yama.ptrace_scopeОграничение ptrace: 0 — классика; 1 — только родитель или CAP_SYS_PTRACE; 2 — только CAP_SYS_PTRACE; 3 — полный запрет

4.5 abi.*, debug.*, dev.*, sunrpc.* — узкоспециализированные


📘 Устройства, cgroups, namespace, монтирование, capabilities

5. udev — динамическое управление устройствами

udev обрабатывает события от uevent ядра (kobject_uevent) и управляет узлами устройств в /dev, применяет правила, запускает скрипты, устанавливает атрибуты.

5.1 Основные пути конфигурации

  • /etc/udev/udev.conf — глобальные настройки
  • /usr/lib/udev/rules.d/ — правила от пакетов (не редактировать)
  • /etc/udev/rules.d/ — пользовательские правила (имеют приоритет)
  • /run/udev/rules.d/ — временные правила (не сохраняются после перезагрузки)

5.2 Структура правила (*.rules)

Формат: KEY=="value", KEY="value", SYMLINK+="name", MODE="0660", …

5.2.1 Матчинг (условия)
КлючПримерОписание
KERNEL==KERNEL=="sda[0-9]*"Имя устройства в ядре (например, sda1)
KERNELS==KERNELS=="2-1.2:1.0"Имя или часть пути в /sys/devices/ (рекурсивно вверх)
SUBSYSTEM==SUBSYSTEM=="block"Подсистема (block, net, usb, scsi, input, tty, drm, leds)
DRIVER==DRIVER=="usb-storage"Драйвер устройства
ATTR{<file>}==ATTR{size}=="250069680"Проверка содержимого файла в /sys/class/…/<dev>/<file>
ATTRS{<file>}==ATTRS{idVendor}=="0781"То же, но рекурсивный поиск вверх по дереву устройств
ENV{<var>}==ENV{ID_BUS}=="usb"Проверка окружения (устанавливается предыдущими правилами)
TAG==TAG=="systemd"Проверка наличия тега (например, systemd, seat, uaccess)
GOTO, LABELGOTO="skip", LABEL="skip"Управление потоком выполнения правил
TEST==TEST!="/usr/bin/foo"Проверка существования файла
5.2.2 Действия (назначения)
КлючПримерЭффект
NAME=NAME="mydisk"Имя узла устройства (/dev/mydisk; только в первом совпадающем правиле!)
SYMLINK+=SYMLINK+="disk/by-id/my-ssd"Доп. символические ссылки (в /dev/)
OWNER=, GROUP=, MODE=OWNER="timur", GROUP="disk", MODE="0660"Владелец, группа, права доступа (восьмеричные)
ATTR{<file>}=ATTR{power/control}="auto"Запись значения в файл /sys/…/<file>
RUN+=RUN+="/sbin/blkid -g"Запуск программы (от root, синхронно)
PROGRAM=PROGRAM="/bin/sh -c 'echo %k:%E{ID_SERIAL_SHORT}'"Выполнение, результат — в %c, %cN
IMPORT{<type>}=IMPORT{cmdline}="root" — импорт из /proc/cmdline IMPORT{builtin}="blkid" — вызов встроенного хелпера IMPORT{program}="custom-script %k"Импорт переменных окружения
TAG+=TAG+="uaccess"Добавление тега (используется logind, systemd)
OPTIONS=OPTIONS="string_escape=replace", "watch", "nowatch", "link_priority=100"Служебные опции
5.2.3 Встроенные хелперы (IMPORT{builtin})
ХелперДействиеПеременные окружения (примеры)
path_idГенерирует стабильный ID путиID_PATH, ID_PATH_TAG
usb_idАнализ USB-устройствID_VENDOR_ID, ID_MODEL_ID, ID_VENDOR, ID_MODEL, ID_SERIAL, ID_BUS
pciPCI-информацияID_PCI_CLASS_FROM_DATABASE, ID_VENDOR_FROM_DATABASE
blkidАнализ ФС и метокID_FS_TYPE, ID_FS_UUID, ID_FS_LABEL, ID_FS_VERSION, ID_PART_TABLE_TYPE, ID_PART_ENTRY_*
hwdbЗапрос hwdb (через systemd-hwdb)Любые поля из /etc/udev/hwdb.d/*.hwdb
net_idГенерация предсказуемых имён сетевых интерфейсовID_NET_NAME_PATH, ID_NET_NAME_SLOT, ID_NET_NAME_MAC
scsi_idSCSI/VPD IDID_SCSI_SERIAL, ID_WWN
input_idHID/клавиатуры/мышиID_INPUT, ID_INPUT_KEYBOARD, ID_INPUT_MOUSE, ID_VENDOR, ID_MODEL
5.2.4 Переменные подстановки (% и $)
ПеременнаяЗначение
%kИмя устройства (sda1)
%nНомер раздела (для sda11)
%pПуть в /sys (/devices/pci0000:00/…/sda1)
%bИмя родительского блочного устройства (sda)
%s{<attr>}Значение sysfs-атрибута (%s{size})
%E{<env>}Переменная окружения (%E{ID_FS_UUID})
%c, %cNВывод PROGRAM (всё / N-е поле)
$devpath, $id, $nameУстаревшие (совместимость)

⚠️ Правила обрабатываются по порядку имён файлов (00-, 10-, 60-, 99-). Пользовательские — в /etc/, не должны перезаписываться пакетами.


6. cgroups — контроль и изоляция ресурсов

Два major-релиза: cgroups v1 (многоконтроллерная) и cgroups v2 (унитарная иерархия). Совместимость: mount -t cgroup2 none /sys/fs/cgroup.

6.1 Общие понятия

  • cgroup — группа процессов с общими лимитами/учётом
  • контроллер (subsystem) — модуль ядра, управляющий ресурсом
  • хостер — процесс, создающий/управляющий cgroup
  • делегирование — передача управления поддерева unprivileged-пользователю (cgroup.subtree_control, cgroup.procs, cgroup.threads)
  • scope — временная группа (например, user@1000.service)
  • slice — иерархическая единица в systemd (system.slice, user.slice, machine.slice)

6.2 cgroups v1 — ключевые контроллеры

КонтроллерМонтируется какОсновные файлы/параметрыПримечания
cpucgroup/cpucpu.shares (вес: 1024 = база), cpu.cfs_period_us (100000), cpu.cfs_quota_us (-1 = неограниченно), cpu.rt_period_us, cpu.rt_runtime_usПоддержка CFS и RT планировщиков
cpusetcgroup/cpusetcpuset.cpus, cpuset.mems, cpuset.cpu_exclusive, cpuset.sched_load_balance, cpuset.memory_spread_{page,slab}Привязка к CPU/NODE (NUMA)
memorycgroup/memorymemory.limit_in_bytes, memory.soft_limit_in_bytes, memory.memsw.limit_in_bytes (RAM+swap), memory.kmem.limit_in_bytes, memory.use_hierarchy, memory.oom_control (вкл/выкл OOM killer), memory.pressure_level, memory.swappinesskmem — ядерные аллокации (в >=4.15 deprecated)
blkiocgroup/blkioblkio.weight, blkio.weight_device, blkio.throttle.read_bps_device, blkio.throttle.write_iops_device, blkio.leaf_weight, blkio.time, blkio.sectorsОграничение скорости диска (MB/s, IOPS)
devicescgroup/devicesdevices.allow, devices.deny (формат: c 1:3 rwm, b *:* r, a — all)Контроль доступа к /dev/*
freezercgroup/freezerfreezer.state (RUNNING, FREEZING, FROZEN)Приостановка всех процессов в группе (kill -STOP на уровне ядра)
net_clscgroup/net_clsnet_cls.classid (hex: 0x100001)Маркировка пакетов (для tc фильтрации)
net_priocgroup/net_prionet_prio.ifpriomap (eth0 5)Приоритет исходящего трафика по интерфейсу
perf_eventcgroup/perf_eventДля perf — мониторинг группы
hugetlbcgroup/hugetlbhugetlb.<size>.limit_in_bytes (hugetlb.2MB.limit_in_bytes)Ограничение huge pages
pidscgroup/pidspids.max, pids.currentЛимит на число процессов/потоков
rdmacgroup/rdmardma.max (hca_name hca_port max_qp max_cq)Для InfiniBand/RoCE

❗ В cgroups v1 один процесс может быть в разных cgroup для разных контроллеров → сложность координации.

6.3 cgroups v2 — унифицированная иерархия

Единая точка монтирования: /sys/fs/cgroup.

6.3.1 Управление поддеревьями
ФайлОписание
cgroup.subtree_controlЗапись +cpu +memory → включить контроллеры в дочерних cgroup. Чтение → активные в этом узле.
cgroup.controllersСписок контроллеров, доступных для делегирования в данном узле
cgroup.eventspopulated 0/1 — есть ли процессы в поддереве (включая вложенные)
cgroup.max.depth, cgroup.max.descendantsЛимиты на глубину и число потомков (защита от атак)
6.3.2 Контроллеры в v2 (не все v1 реализованы)
КонтроллерФайлы / ПараметрыОтличия от v1
cpucpu.weight (1–10000, 100 = база), cpu.max (<quota> <period> или max 100000), cpu.idle (0/1), cpu.pressure (PSI для CPU)Замена shares/quota; поддержка PSI
memorymemory.max, memory.low, memory.min, memory.high, memory.swap.max, memory.oom.group, memory.pressure, memory.events (low high max oom oom_kill), memory.stat (детальный учёт)min/low/high — иерархия защиты; PSI встроен
ioio.max (dev: MAJ:MIN rbps=1048576 wbps=max riops=100 wiops=max), io.weight, io.pressure, io.statОбъединение blkio и cfq логики
pidspids.max, pids.currentБез изменений
rdmardma.maxБез изменений
cpusetcpuset.cpus, cpuset.mems, cpuset.cpus.partition (root, member, invalid)Поддержка изолированных CPU-партиций (для DPDK/realtime)
hugetlbhugetlb.<size>.maxАналогично v1
misc (новый)misc.max (controller_name limit)Возможность расширения через LSM (например, NVMe, GPU)
6.3.3 PSI — Pressure Stall Information (встроено в v2)
ФайлОписание
cpu.pressuresome avg10=0.00 avg60=0.00 avg300=0.00 total=123456789
memory.pressuresome (столкновения с high/max), full (столкновения с max + reclaim stall)
io.pressuresome (ожидание I/O), full (все процессы заблокированы на I/O)

💡 PSI — объективная метрика «недоступности» ресурса, лучше %idle или free.

6.3.4 Делегирование unprivileged

Требования:

  1. cgroup.subtree_control в родительском cgroup включает нужные контроллеры
  2. Пользователь имеет rwm на cgroup.procs, cgroup.threads, cgroup.subtree_control, cgroup.controllers
  3. Создаётся подкаталог, в него пишется +cpu +memory в subtree_control
# Пример: пользователь 1000 делегирует себе cpu+memory
mkdir -p /sys/fs/cgroup/user-tasks
chown -R 1000:1000 /sys/fs/cgroup/user-tasks
# Внутри сессии пользователя:
mkdir /sys/fs/cgroup/user-tasks/myapp
echo "+cpu +memory" > /sys/fs/cgroup/user-tasks/myapp/cgroup.subtree_control
echo $$ > /sys/fs/cgroup/user-tasks/myapp/cgroup.procs

7. Namespace — изоляция глобальных ресурсов

Создаются через clone(2), unshare(2), setns(2) или unshare/nsenter CLI.

NamespaceФлаг clone()Псевдо-ФСЧто изолируется
mountCLONE_NEWNS/proc/<pid>/ns/mntИерархия точек монтирования (chroot + гибкость)
UTSCLONE_NEWUTS/proc/<pid>/ns/utsИмя хоста (hostname) и домен (domainname)
IPCCLONE_NEWIPC/proc/<pid>/ns/ipcSystem V IPC: очереди, семафоры, разделяемая память
PIDCLONE_NEWPID/proc/<pid>/ns/pid /proc/<pid>/ns/pid_for_childrenПространство PID (внутри — init = PID 1); pid_for_children — для потомков после execve
networkCLONE_NEWNET/proc/<pid>/ns/netСетевой стек: интерфейсы, таблицы маршрутизации, iptables/nft, сокеты
userCLONE_NEWUSER/proc/<pid>/ns/userUID/GID-маппинг (/proc/self/uid_map, /gid_map), capabilities
cgroupCLONE_NEWCGROUP/proc/<pid>/ns/cgroupВидимость иерархии cgroups (v2-only; в v1 — нет смысла)
time (5.6+)CLONE_NEWTIME/proc/<pid>/ns/time /proc/<pid>/ns/time_for_childrenCLOCK_MONOTONIC, CLOCK_BOOTTIME — смещение (clock_adjtime(CLOCK_TAI, …))

7.1 UID/GID маппинг в user namespace

Формат /proc/<pid>/uid_map:

<внутренний_начало> <внешний_начало> <длина>

Пример:

0 100000 65536

→ Внутри: UID 0–65535 → снаружи: 100000–165535.

Требования:

  • Пишется один раз после unshare(CLONE_NEWUSER)
  • Должен покрывать UID/GID процесса, делающего execve
  • /proc/sys/kernel/unprivileged_userns_clone = 1 — разрешить unprivileged создание (по умолчанию 1 в Ubuntu/Arch, 0 в RHEL)

7.2 Стек namespace в systemd-nspawn / podman

Типичный набор:

unshare --user --map-root-user \
--pid --fork \
--net --uts --ipc \
--mount-proc \
sh

8. Монтирование — опции и флаги

8.1 Общие флаги (mount(2), MS_*)

ФлагЗначениеЭквивалент в mount -o
MS_RDONLYТолько для чтенияro
MS_NOSUIDИгнорировать setuid/setgidnosuid
MS_NODEVНе интерпретировать спец. файлыnodev
MS_NOEXECЗапретить exec()noexec
MS_NOATIMEНе обновлять atimenoatime
MS_NODIRATIMEНе обновлять atime у директорийnodiratime
MS_RELATIMEatime = max(atime, mtime, ctime)relatime (по умолчанию с 2.6.30)
MS_STRICTATIMEВсегда обновлять atimestrictatime
MS_LAZYTIMEОбновлять atime/mtime/ctime в памяти, сбрасывать в ФС редкоlazytime

8.2 Флаги распространения (mount propagation)

ФлагОписание
MS_SHAREDСобытия монтирования/размонтирования реплицируются в другие shared-точки
MS_SLAVEПолучает события от master, но не отправляет обратно
MS_PRIVATEИзолирован — без репликации (по умолчанию с ядра 2.4.11)
MS_UNBINDABLEНельзя bind-монтировать эту точку

Комбинации:

  • --make-rsharedMS_SHARED \| MS_REC
  • --make-rslaveMS_SLAVE \| MS_REC
  • --make-rprivateMS_PRIVATE \| MS_REC
  • --bind + --make-privateMS_BIND \| MS_PRIVATE

8.3 Опции ФС (часто используемые)

ФСОпцииПримечания
ext4`data=journalordered
xfslogbufs=N, logbsize=N, allocsize=N, swalloc, noalign, inode64, grpid, nogrpid, ikeep, noikeep, quota, uquota, gquota, prjquota, sunit=N, swidth=Ninode64 — разрешить inodes > 2^32
btrfscompress=zstd:l5, autodefrag, nodatacow, nodatasum, space_cache=v2, subvol=NAME, subvolid=N, commit=N, ssd, ssd_spread, noacl, aclnodatacow отключает COW → для ВМ/БД, но теряет snapshots
tmpfssize=, nr_inodes=, mode=, uid=, gid=, huge=always/within_size/never, mpol=size по умолчанию = 50% RAM
overlaylowerdir=, upperdir=, workdir=, index=on/off, xino=on/auto/off, metacopy=on/off, redirect_dir=on/off, userxattrТребует workdir на той же ФС, что upperdir
prochidepid=0/1/2, gid=Nhidepid=2 — только свои процессы; gid — группа, имеющая доступ
sysfs, debugfs, securityfsОбычно без опцийМонтируются ядром автоматически

📘 Security, Audit, PAM, Capabilities, Seccomp

9. Capabilities — разбиение привилегий root

Вместо монолитного UID=0, ядро делит права на набор capabilities (см. man 7 capabilities).
Процесс имеет 5 наборов битовых масок (по 64 бита в ядре ≥5.8):

НаборОписаниеИзменяется
Permitted (p)Возможные capabilities, которые процесс может использоватьexecve() наследует от файла (+p) или урезает по правилам
Inheritable (i)Capabilities, наследуемые дочерними при execve() (если файл имеет +i)Явно устанавливается (capset)
Effective (e)Capabilities, активные сейчас (для проверки в ядре)Для «legacy» бинарников — весь pe; иначе — только если +ep в файле
Bounding (b)Верхняя граница: нельзя добавить capability, отсутствующую здесьУменьшается только (prctl(PR_CAPBSET_DROP, ...)), сбрасывается в execve()
Ambient (a)Capabilities, автоматически активируемые в e после execve() (для non-root)Требует: i ⊆ a ⊆ p, securebits & SECURE_NO_SETUID_FIXUP

9.1 Стандартные capabilities (2024, ядро 6.8+)

CapabilityКраткое назначениеТипичные команды/действия
CAP_CHOWNИзменение владельца файлаchown
CAP_DAC_OVERRIDEОбход проверок rwx (но не DAC для CAP_DAC_READ_SEARCH)Чтение/запись любых файлов
CAP_DAC_READ_SEARCHОбход r для файлов и x для каталоговopen(O_RDONLY), stat() на любые пути
CAP_FOWNERОбход проверок владельца при chmod, chown, setxattr и др.chmod на чужие файлы
CAP_FSETIDНе сбрасывать setuid/setgid бит при write()Сохранение chmod +s после редактирования
CAP_KILLОтправка сигналов любому процессуkill -9 1 (если euid ≠ 0)
CAP_SETGIDИзменение GID, добавление группsetgid(), setgroups()
CAP_SETUIDИзменение UIDsetuid(), setreuid()
CAP_SETPCAPДобавление capabilities в Bounding других процессовcapset() на чужие процессы
CAP_LINUX_IMMUTABLEУстановка/снятие флагов FS_IMMUTABLE_FL, FS_APPEND_FLchattr +i, +a
CAP_NET_BIND_SERVICEПривязка к портам < 1024python -m http.server 80
CAP_NET_BROADCASTОтправка широковещательных пакетовping -b (редко используется)
CAP_NET_ADMINУправление сетью: интерфейсы, маршруты, iptables, qdisc, tun/tapip link set up, tc qdisc add, iptables -A
CAP_NET_RAWИспользование RAW и PACKET сокетовping, tcpdump, arping
CAP_IPC_LOCKБлокировка памяти (mlock, mlockall)mlock() без лимита RLIMIT_MEMLOCK
CAP_IPC_OWNERОбход проверок владельца в IPCmsgctl(IPC_RMID) на чужие очереди
CAP_SYS_MODULEЗагрузка/выгрузка модулей ядраinsmod, rmmod, modprobe
CAP_SYS_RAWIOДоступ к портам ввода-вывода, /dev/mem, /dev/kmemiopl(3), ioperm(), dd if=/dev/mem
CAP_SYS_CHROOTВызов chroot()chroot /newroot
CAP_SYS_PTRACEptrace() любому процессуgdb -p, strace -p
CAP_SYS_PACCTВключение учёта процессовacct()
CAP_SYS_ADMIN«Корзина»: mount/umount, pivot_root, swapon, quotactl, nfsservctl, syslog, reboot, perf_event_open, keyctl, name_to_handle_at, open_by_handle_at, bpfОчень широкие права — избегать
CAP_SYS_BOOTВызов reboot()reboot, shutdown -r
CAP_SYS_NICEИзменение приоритета (nice, setpriority, sched_setscheduler)nice -n -20, chrt -f 99
CAP_SYS_RESOURCEОбход лимитов (setrlimit, ulimit)ulimit -n 1000000
CAP_SYS_TIMEИзменение системного времениsettimeofday(), adjtimex()
CAP_SYS_TTY_CONFIGНастройка терминалов (vhangup, kd*)vhangup()
CAP_MKNOD (legacy)Создание спец. файловmknod /dev/null c 1 3удалён в ядре ≥2.2, заменён на CAP_MKNOD в capability bitmask, но реально контролируется через DAC
CAP_LEASEУстановка файловых лиз (F_SETLEASE)fcntl(fd, F_SETLEASE, F_RDLCK)
CAP_AUDIT_WRITEЗапись в аудит-логaudit_log_user_message()
CAP_AUDIT_CONTROLУправление аудитом (auditctl)auditctl -e 0
CAP_SETFCAPУстановка capabilities на исполняемые файлыsetcap cap_net_bind_service+ep /usr/bin/python3
CAP_MAC_OVERRIDEОбход MAC (SELinux/AppArmor)Только если LSM разрешает
CAP_MAC_ADMINНастройка политики MACsemanage, setsebool
CAP_SYSLOGЧтение dmesg, syslog()dmesg, journalctl --dmesg
CAP_WAKE_ALARMПробуждение системы из suspendtimerfd_create(CLOCK_REALTIME_ALARM)
CAP_BLOCK_SUSPENDБлокировка перехода в suspendioctl(fd, BLKBSZSET) — устаревшее; новое — через wakeup source в sysfs

9.2 Управление capabilities

КомандаПримерЭффект
getcap <file>getcap /usr/bin/ping/usr/bin/ping = cap_net_raw+epЧтение capabilities файла
setcap <caps> <file>setcap cap_net_bind_service+ep /opt/app/serverНазначение capabilities исполняемому
capsh --printВывод capabilities текущего процесса (p, i, e, b, a)
prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, CAP_NET_BIND_SERVICE)В коде на CДобавление capability в Ambient набор
capsh --drop=cap_sys_admin -- -c "command"Запуск команды без указанной capability

⚠️ Важно: setcap сбрасывает setuid/setgid биты. Если нужен setuid, используйте wrapper-скрипт или ambient capabilities.


10. Seccomp — ограничение системных вызовов

Два режима:

  • SECCOMP_MODE_STRICT — только read, write, exit, sigreturn (редко используется)
  • SECCOMP_MODE_FILTER — BPF-фильтр, разрешающий/запрещающий syscalls

10.1 Основные инструменты

  • libseccomp — библиотека для генерации BPF (scmp_sys_resolver, seccomp_init(SCMP_ACT_KILL_PROCESS))
  • strace -q -e trace=%desc,%file,%ipc,… — анализ вызовов для профилирования
  • oci-seccomp-bpf-hook, crun, runc — интеграция в контейнеры
  • systemdSystemCallFilter= в юнитах

10.2 Системные вызовы по категориям (часто фильтруются)

КатегорияВызовыКомментарий
Памятьmmap, mprotect, mlock, munlock, madvise, brkmmap(PROT_EXEC) — потенциально опасен
Процессыfork, vfork, clone, execve, execveat, prctl, ptrace, seccomp, unshare, setnsexecve — ключевой; ptrace — отладка
Файлыopen, openat, openat2, creat, close, read, write, lseek, stat, fstat, lstat, fstatat, access, faccessat, unlink, unlinkat, rename, renameat, chmod, fchmod, chown, fchown, utime, utimes, futimesat, truncate, ftruncateopenat2 — новый, безопаснее openat
Сетьsocket, connect, bind, listen, accept, accept4, send, recv, sendto, recvfrom, sendmsg, recvmsg, getsockopt, setsockopt, getsockname, getpeername, shutdown, socketpairsocket(AF_PACKET, SOCK_RAW) → требует CAP_NET_RAW
IPCpipe, pipe2, socketpair, shmget, shmat, shmdt, shmctl, msgget, msgsnd, msgrcv, msgctl, semget, semop, semctlSystem V IPC
Времяtime, stime, gettimeofday, settimeofday, adjtime, clock_gettime, clock_settime, clock_adjtime, nanosleep, alarm, setitimer, timer_create, timer_settimesettimeofday → требует CAP_SYS_TIME
Системаreboot, syslog, acct, mount, umount, pivot_root, swapon, swapoff, quotactl, sysfs, get_kernel_syms, query_module, delete_module, init_module, finit_module, perf_event_open, bpf, userfaultfd, io_uring_setup, landlock_create_rulesetКритически опасные — почти всегда блокируются

10.3 Примеры фильтрации в systemd

[Service]
# Разрешить только вызовы, необходимые для HTTP-сервера:
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources @debug @module @mount @raw-io @reboot @swap
# Или явно:
SystemCallFilter=…
# Разрешить только:
# read write close fcntl epoll_ctl epoll_wait socket connect sendto recvfrom
# mmap mprotect brk rt_sigaction rt_sigprocmask exit_group clock_gettime

🔐 Рекомендуется: начинать с SystemCallArchitectures=native, NoNewPrivileges=yes, PrivateDevices=yes, ProtectSystem=strict, ProtectHome=read-only, затем сужать SystemCallFilter.


11. LSM — Mandatory Access Control

11.1 SELinux (Security-Enhanced Linux)

Основные компоненты:
  • Политика — правила доступа (targeted, minimum, mls)
  • Модули политики — расширения (semodule -l)
  • Контексты — метки (user:role:type:level)
  • Булевы — переключатели политики (getsebool -a)
  • Transitions — смена типа при execve
Ключевые команды:
КомандаНазначение
sestatusСтатус: enabled/disabled, режим (enforcing/permissive/disabled)
getenforce / `setenforce 01`
semanage fcontext -lПросмотр правил контекстов файлов
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"Добавить правило контекста
restorecon -Rv /webПрименить контексты по правилам
semanage port -lСписок портов и их типов
semanage port -a -t http_port_t -p tcp 8080Разрешить httpd слушать 8080
getsebool -a | grep httpdФильтр булевых по httpd
setsebool -P httpd_can_network_connect 1Разрешить httpd исходящие соединения (постоянно)
ausearch -m avc -ts recentПоиск AVC-денег в аудите
audit2allow -aГенерация модуля политики из AVC-логов
Контексты процессов (/proc/<pid>/attr/current):
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  • unconfined_u — пользователь (не system_u)
  • unconfined_r — роль
  • unconfined_t — тип (неограниченный)
  • s0-s0:c0.c1023 — MLS/MCS уровень
Режимы:
  • enforcing — блокировать и логировать
  • permissive — только логировать
  • disabled — LSM не загружен (требует перезагрузки)

11.2 AppArmor

Основные компоненты:
  • Профили/etc/apparmor.d/ (имя = путь к бинарнику с заменой /.)
  • Режимы: complain (только лог), enforce (блокировка)
  • Abstractions — переиспользуемые фрагменты (abstractions/base, abstractions/nameservice)
  • Hat — подпрофили для change_hat() (например, веб-приложения)
Ключевые команды:
КомандаНазначение
aa-statusСтатус: загруженные профили, режимы, процессы
aa-complain /path/to/binПеревести профиль в complain
aa-enforce /path/to/binПеревести в enforce
aa-disable /path/to/binОтключить профиль
aa-genprof /path/to/binИнтерактивное создание профиля
aa-logprofАнализ /var/log/audit/audit.log и обновление профилей
apparmor_parser -r /etc/apparmor.d/profileПерезагрузка профиля
Пример профиля:
#include <tunables/global>

/usr/bin/example {
#include <abstractions/base>
#include <abstractions/nameservice>

/home/*/.config/example/ rw,
/usr/share/example/** r,
/tmp/example-*.tmp rw,
network inet stream,

# Запретить exec
deny /bin/** ix,
deny /usr/bin/** ix,
}

💡 AppArmor проще для старта, SELinux — гибче и строже. Выбор зависит от дистрибутива (RHEL — SELinux, SUSE/Ubuntu — AppArmor).


12. Auditd — аудит событий ядра и пользовательского пространства

12.1 Архитектура

  • auditd — демон, пишущий в /var/log/audit/audit.log
  • auditctl — утилита управления правилами
  • ausearch, aureport — анализ логов
  • audispd — плагины (например, audisp-remote для отправки на сервер)

12.2 Типы правил

ТипСинтаксисПример
Системные вызовы-a <list>,<action> -S <syscall> [ -F <фильтр> ]-a always,exit -S openat -F exit=-EACCES
Файлы/каталоги-w <путь> -p <perms> -k <ключ>-w /etc/shadow -p wa -k identity
Сетевые события-a always,exit -F arch=b64 -S socket -F a0=2 -F a1\&2 -k network-rawПерехват socket(AF_INET, SOCK_RAW, …)
Пользователи-a always,exit -F arch=b64 -S execve -F euid=0 -k root-commandsВсе execve от root

12.3 Фильтры (-F)

ФильтрПримерОписание
arch=b64Архитектура (важно для multilib)
exit=-EPERMexit=-1Код возврата системного вызова
a0=…, a1=…a0=2Аргументы (a0 = arg0)
uid=, euid=, suid=euid=0UID процесса
pid=, ppid=PID и родительский PID
key=key=audit-configКлюч для фильтрации в ausearch -k

12.4 Анализ

# Последние 10 событий
ausearch -m SYSCALL -ts recent | tail -10

# Все попытки доступа к /etc/shadow
ausearch -f /etc/shadow

# Отчёт по ключу
aureport -k --summary

# Отчёт по пользователям
aureport -u --failed

⚠️ Аудит создаёт нагрузку. Используйте фильтрацию и rate_limit, max_log_file_action=ROTATE.


13. PAM — Pluggable Authentication Modules

Четыре типа модулей:

  • auth — аутентификация (пароль, 2FA)
  • account — авторизация (срок действия, доступ по времени)
  • session — управление сессией (mount, env, logging)
  • password — смена пароля

13.1 Стек модулей (/etc/pam.d/<service>)

Формат строки:

<type> <control> <module-path> [module-arguments]
ControlЗначение
requiredДолжен succeed; ошибка → отложенная неудача
requisiteДолжен succeed; ошибка → немедленный fail
sufficientЕсли succeed → успех (если до этого не было fail); если fail → игнор
optionalИгнорируется, если не единственный
[value=action …]Явное управление ([success=ok new_authtok_reqd=done default=bad])

13.2 Часто используемые модули

МодульТипыНазначение
pam_unix.soauth, account, password, sessionСтандартная аутентификация (shadow, /etc/passwd)
pam_deny.soВсеВсегда fail
pam_permit.soВсеВсегда success
pam_faillock.soauthБлокировка после N неудач (preauth, authfail, authsucc)
pam_tally2.soauth, accountУстаревший счётчик неудач (заменён faillock)
pam_limits.sosessionУстановка ulimit из /etc/security/limits.conf
pam_systemd.sosessionРегистрация сессии в logind (cgroup, XDG_RUNTIME_DIR)
pam_mkhomedir.sosessionАвтосоздание /home/$USER при первом входе
pam_gnome_keyring.soauth, sessionИнтеграция с GNOME Keyring
pam_sss.soВсеИнтеграция с SSSD (LDAP/AD)
pam_ldap.soВсеПрямой доступ к LDAP (устаревает в пользу SSSD)
pam_radius_auth.soauthАутентификация через RADIUS
pam_u2f.soauth2FA через FIDO U2F
pam_google_authenticator.soauthTOTP/MOTP 2FA

13.3 Пример: /etc/pam.d/sshd

# Аутентификация
auth required pam_faillock.so preauth
auth sufficient pam_unix.so
auth [default=die] pam_faillock.so authfail
auth required pam_faillock.so authsucc

# Учётная запись
account required pam_unix.so
account required pam_access.so

# Сессия
session required pam_unix.so
session required pam_systemd.so
session optional pam_mkhomedir.so skel=/etc/skel umask=0022

# Смена пароля
password required pam_unix.so sha512 shadow try_first_pass

🔐 Рекомендуется: включать pam_faillock, pam_access, pam_systemd, избегать sufficient pam_permit.so.


📘 Сеть, Хранилище, Виртуализация

14. Сетевая подсистема — изоляция и управление трафиком

14.1 Network Namespace (netns)

Изолирует:

  • сетевые интерфейсы (lo, eth0, veth0)
  • таблицы маршрутизации (ip route, ip rule)
  • таблицы iptables/nftables
  • сокеты (все TCP/UDP/RAW)
  • ARP/NDP-кэш, conntrack
Управление:
# Создание
ip netns add ns1

# Выполнение команды
ip netns exec ns1 ip a

# Связывание с mount namespace (для /etc/netns/<name>/resolv.conf)
ip netns exec ns1 mount --bind /etc/netns/ns1/resolv.conf /etc/resolv.conf

# Удаление
ip netns delete ns1

💡 /var/run/netns/ — симлинки на nsfs-файлы. Удаление каталога не удаляет namespace, пока есть процессы.

14.2 Виртуальные интерфейсы

ТипКоманда созданияНазначениеОсобенности
vethip link add veth0 type veth peer name veth1Пара интерфейсов, соединённых «виртуальным кабелем»Перемещение одного конца в netns: ip link set veth1 netns ns1
bridgeip link add br0 type bridge ip link set veth0 master br0Коммутатор уровня 2 (L2)Поддержка STP, VLAN filtering, hairpin_mode
macvlanip link add macvlan0 link eth0 type macvlan mode privateНесколько MAC на одном физ. интерфейсеРежимы: private, vepa, bridge, passthru
ipvlanip link add ipvlan0 link eth0 type ipvlan mode l3Несколько IP на одном MAC (L3/L2)Режимы: l2, l3, l3s (с поддержкой conntrack)
vlanip link add link eth0 name eth0.100 type vlan id 100802.1Q VLANТребует CONFIG_VLAN_8021Q
vxlanip link add vxlan100 type vxlan id 100 dev eth0 dstport 4789Overlay-сеть (L2 over UDP)Может использовать fdb для unicast/multicast
geneveip link add geneve1 type geneve id 1000 remote 192.168.1.10Расширяемый overlay (RFC 8926)Поддержка опций (TLS, OAM)
tun/tapip tuntap add dev tun0 mode tunИнтерфейс для userspace-сетевых стеков (VPN, QEMU)tun — L3 (IP), tap — L2 (Ethernet)
Пример подключения контейнера к bridge:
ip netns add container
ip link add veth0 type veth peer name veth1
ip link set veth1 netns container
ip link set veth0 master br0 up
ip netns exec container ip link set veth1 up
ip netns exec container ip addr add 10.0.0.2/24 dev veth1

14.3 Traffic Control (tc)

Архитектура: qdiscclassfilter

Типы qdisc:
ТипНазначениеПараметры
pfifo_fastFIFO с 3-мя band (TOS-based)priomap
fq (Fair Queue)Per-flow fairness, pacinglimit, flows, quantum, flow_limit
fq_codelfq + CoDel AQMtarget, interval, ecn
cakeУниверсальный qdisc (ингресс/эгресс, shaping, AQM)bandwidth, rtt, flowmode, nat, ack-filter
htb (Hierarchical Token Bucket)Иерархическое ограничение скоростиrate, ceil, burst, quantum, prio
tbf (Token Bucket Filter)Простое ограничениеrate, burst, limit, latency
Пример: ограничение до 100 Mbps с HTB
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 90mbit ceil 100mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10

14.4 nftables — современная замена iptables

Архитектура:
  • tablechainrule
  • Встроенные типы цепочек: filter, nat, route, arp, bridge, netdev
Пример: базовый firewall
table inet filter {
chain input {
type filter hook input priority 0; policy drop;

ct state established,related accept
iif "lo" accept
ip protocol icmp accept
tcp dport { 22, 80, 443 } accept
}

chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
}

chain output {
type filter hook output priority 0; policy accept;
}
}
Преимущества перед iptables:
  • единый синтаксис для IPv4/IPv6/ARP/bridge
  • атомарные обновления
  • встроенная поддержка множеств (set, map)
  • более эффективная обработка (меньше traversals)
  • поддержка JSON (nft -j list ruleset)

🔄 Миграция: iptables-translate, iptables-restore-translate.


15. Хранилище — LVM, RAID, шифрование, современные ФС

15.1 LVM (Logical Volume Manager)

Иерархия:
Физ. устройство → PV (Physical Volume) → VG (Volume Group) → LV (Logical Volume) → ФС

Управление:
# Создание PV
pvcreate /dev/sdb /dev/sdc

# Создание VG
vgcreate vg_data /dev/sdb /dev/sdc

# Создание LV (linear)
lvcreate -L 100G -n lv_home vg_data

# Thin provisioning
lvcreate -L 1T -T vg_data/pool
lvcreate -V 100G -T vg_data/pool -n lv_snap

# Snapshot (устаревший, для thin — см. выше)
lvcreate -L 10G -s -n snap_home /dev/vg_data/lv_home

# Расширение
lvextend -L +50G /dev/vg_data/lv_home
resize2fs /dev/vg_data/lv_home # для ext4
xfs_growfs /mount/point # для xfs
Флаги LV:
ФлагКомандаЭффект
+wlvchange -ay --permission rw /dev/vg/lvRead-write
+rlvchange -ay --permission r /dev/vg/lvRead-only
+alvchange -ay /dev/vg/lvАктивация
+mlvconvert -m1 /dev/vg/lvЗеркалирование (RAID1)
+Rlvconvert --stripes 4 --type raid5 /dev/vg/lvRAID 5/6/10

15.2 mdadm — программный RAID

УровеньМин. дисковНадёжностьПроизводительность
RAID 02НетЧтение/запись — линейный рост
RAID 121 дискЧтение — N×, запись — как один
RAID 531 дискЧтение — (N−1)×, запись — дорого (RMW)
RAID 642 дискаЧтение — (N−2)×, запись — ещё дороже
RAID 104N/2 дисковЧтение/запись — близко к RAID 0
Пример RAID 10:
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[bcde]
mkfs.xfs /dev/md0
mdadm --detail /dev/md0 # состояние
cat /proc/mdstat # прогресс resync
Флаги mdadm:
ФлагОписание
--bitmap=internalВнутренняя bitmap для ускорения resync
--write-mostlyПометить диск как «медленный» (для гибридных RAID)
--failfastБыстро отмечать диск как failed
--symlinks=noНе создавать /dev/md/ симлинки

15.3 Шифрование — dm-crypt / LUKS2

LUKS2 особенности:
  • JSON-заголовок (гибкость)
  • Поддержка argon2i/argon2id (против GPU-брутфорса)
  • Несколько ключей (до 32 слотов)
  • integrity (DM-Integrity + HMAC)
  • sector_size (4K для SSD)
Управление:
# Инициализация
cryptsetup luksFormat --type luks2 --pbkdf argon2id --hash sha512 /dev/sdb1

# Открытие
cryptsetup open /dev/sdb1 crypt_data

# Проверка
cryptsetup luksDump /dev/sdb1

# Добавление ключа
cryptsetup luksAddKey /dev/sdb1

# Удаление ключа
cryptsetup luksKillSlot /dev/sdb1 1

# Шифрование с целостностью
cryptsetup luksFormat --integrity hmac-sha256 /dev/sdb1

🔐 Рекомендуется: --pbkdf argon2id --iter-time 2000 (≈2 сек на ввод пароля).

15.4 Современные ФС: btrfs и zfs

btrfs — флаги подтомов и устройств
ФлагКомандаЭффект
nodatacowchattr +C /pathОтключает COW (для ВМ/БД), но теряет snapshots
compression=zstd:5mount -o compress=zstd:5Сжатие по умолчанию
ssd_spreadmount -o ssd_spreadОптимизация распределения под SSD
space_cache=v2mount -o space_cache=v2Кэширование свободного места (быстрее df)
autodefragmount -o autodefragДефрагментация «на лету»
zfs — ключевые свойства (zfs get all pool/ds)
СвойствоЗначениеОписание
compressionzstd, lz4, gzip-NАлгоритм сжатия
atimeon/offОбновление времени доступа
xattrsa (system attrs) / dirХранение расширенных атрибутов
recordsize128K (по умолчанию)Размер блока (оптимизировать под нагрузку: 16K для БД)
primarycacheall, metadata, noneЧто кэшировать в ARC
secondarycacheall, noneИспользование L2ARC
logbiaslatency, throughputПриоритет: задержка vs пропускная способность
syncstandard, always, disabledГарантии синхронизации (опасно: disabled)
dedupon/offДедупликация (требует много RAM)

⚠️ zfs — не в mainline ядре (но >=2.6.39 поддерживает ZFS modules via DKMS/ZOL).


16. Виртуализация — KVM/QEMU

16.1 Архитектура

  • qemu-system-x86_64 — эмулятор + гипервизор (через /dev/kvm)
  • libvirt — менеджер ВМ (virsh, virt-manager)
  • virtio — паравиртуализированные драйверы (сети, диски, RNG, balloon)
  • VFIO — прямой доступ к PCI-устройствам (GPU, NIC)

16.2 Ключевые параметры QEMU

CPU:
ПараметрПримерЭффект
-cpuhost, EPYC-v1, Icelake-ServerЭмуляция CPU
+invtsc-cpu host,+invtscИнвариантный TSC (для миграции)
kvm=off-cpu host,kvm=offСкрыть факт виртуализации
hv_time, hv_relaxed, hv_vapic, hv_spinlocks=0x1fffHyper-V enlightenments для Windows
Память:
ПараметрПримерЭффект
-m-m 8G,slots=4,maxmem=32GГорячее добавление памяти
-object memory-backend-file-object memory-backend-file,id=mem1,size=4G,mem-path=/hugepages,share=onИспользование huge pages / shared memory
Диски:
ПараметрПримерЭффект
-drive-drive file=disk.qcow2,if=virtio,cache=none,aio=native,discard=unmapРекомендуемый режим для SSD
detect-zeroes=unmapАвто-TRIM при записи нулей
throttling.*throttling.iops-total=1000Ограничение IOPS
Сеть:
ПараметрПримерЭффект
-netdev-netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56Подключение к bridge
mq=on-device virtio-net-pci,mq=on,vectors=6Multiqueue (до 64 очередей)
Безопасность:
ПараметрПримерЭффект
-sandbox onОграничение системных вызовов через seccomp
-no-user-configИгнорировать ~/.qemu/
-nodefaultsНе добавлять устройства по умолчанию
-chardev socket + -mon chardev=…,mode=controlУправление через QMP (JSON-RPC)

16.3 VFIO — прямой доступ к устройствам

Требования:

  1. Поддержка IOMMU (intel_iommu=on / amd_iommu=on)
  2. Отвязка драйвера: echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
  3. Привязка к vfio-pci: echo "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_override
# Запуск с GPU
qemu-system-x86_64 \
-device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1

⚠️ Для NVIDIA: требует vBIOS патча или acs_override=downstream (небезопасно).

16.4 TPM — виртуальный доверенный платформенный модуль

# Создание emulated TPM
swtpm socket --tpmstate dir=/tmp/mytpm --ctrl type=unixio,path=/tmp/swtpm-sock --log level=20

# В QEMU
-chardev socket,id=chrtpm,path=/tmp/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0

✅ Поддерживается Windows 11, systemd-cryptenroll --tpm2-device=auto.


📘 Ядро, Контейнеры, eBPF, Автоматизация

17. Сборка и отладка ядра

17.1 Подготовка конфигурации

КомандаНазначениеРекомендации
make defconfigБазовая конфигурация для архитектурыМинималистичная, подходит для embedded
make localmodconfigКонфиг под текущие загруженные модулиУбирает всё, кроме используемого; рекомендуется для десктопов/серверов
make localyesconfigТо же, но встраивает (=y) вместо модулей (=m)Меньше initramfs, но больше образ ядра
make olddefconfigПрименить .config, установить новые опции по умолчаниюПосле обновления исходников
make kvm_guest.configНастройки для гостя KVM (в upstream ≥5.17)Оптимизация под виртуализацию
make tinyconfigМинимальное ядро (~300 KB)Только для отладки
Ключевые CONFIG_* опции (для production-серверов):
КатегорияОпцииКомментарий
БезопасностьCONFIG_STRICT_KERNEL_RWX=y, CONFIG_STRICT_MODULE_RWX=y, CONFIG_RETPOLINE=y, CONFIG_RANDOMIZE_BASE=y, CONFIG_SLAB_FREELIST_RANDOM=y, CONFIG_SLAB_FREELIST_HARDENED=y, CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y, CONFIG_INIT_ON_FREE_DEFAULT_ON=y, CONFIG_VMAP_STACK=y, CONFIG_DEBUG_WX=y, CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=yЗащита от ROP/JOP, инициализация памяти
ОтладкаCONFIG_KASAN=y, CONFIG_KASAN_INLINE=y, CONFIG_KASAN_SW_TAGS=y (ARM64), CONFIG_UBSAN=y, CONFIG_DEBUG_ATOMIC_SLEEP=y, CONFIG_PROVE_LOCKING=y, CONFIG_LOCKDEP=y, CONFIG_DEBUG_LIST=y, CONFIG_DEBUG_PLIST=y, CONFIG_DEBUG_SG=y, CONFIG_DEBUG_NOTIFIERS=yТолько для тестов — падение производительности ×2–10
ПроизводительностьCONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y, CONFIG_COMPACTION=y, CONFIG_TRANSPARENT_HUGEPAGE=y, CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y, CONFIG_CFS_BANDWIDTH=y, CONFIG_RT_GROUP_SCHED=y, CONFIG_BPF_JIT=y, CONFIG_BPF_JIT_ALWAYS_ON=yTHP, BPF-JIT, групповое планирование
СетиCONFIG_NET_SCH_FQ_CODEL=y, CONFIG_NET_SCH_CAKE=y, CONFIG_XDP_SOCKETS=y, CONFIG_VXLAN=y, CONFIG_GENEVE=y, CONFIG_NETFILTER_ADVANCED=y, CONFIG_NF_CONNTRACK_TIMEOUT=y, CONFIG_NF_CT_PROTO_DCCP=y, CONFIG_NF_CT_PROTO_SCTP=y, CONFIG_NF_CT_PROTO_UDPLITE=y, CONFIG_NF_TABLES_IPV4=y, CONFIG_NF_TABLES_IPV6=y, CONFIG_NF_TABLES_BRIDGE=y, CONFIG_NFT_FIB_IPV4=y, CONFIG_NFT_FIB_IPV6=yСовременный сетевой стек
ХранилищеCONFIG_BLOCK_COMPAT=y, CONFIG_ZONED_BLOCK_DEVICES=y, CONFIG_NVME_CORE=y, CONFIG_NVME_TCP=y, CONFIG_SCSI_MQ_DEFAULT=y, CONFIG_BLK_WBT=y, CONFIG_BLK_DEV_ZONED=y, CONFIG_FS_DAX=y, CONFIG_DAX_DRIVER=y, CONFIG_ZONEFS_FS=yПоддержка ZNS SSD, DAX, multi-queue SCSI

💡 Для production: отключите все CONFIG_DEBUG_*, включите CONFIG_SLUB_DEBUG_ON=n, CONFIG_DEBUG_INFO=n, CONFIG_STRIP_ASM_SYMS=y.

17.2 Сборка и установка

# Сборка ядра и модулей
make -j$(nproc) bindeb-pkg # для Debian/Ubuntu (создаёт .deb)
make -j$(nproc) modules_install install # ручная установка

# Обновление initramfs
update-initramfs -c -k 6.8.0-custom

# Обновление загрузчика
update-grub

17.3 Отладка ядра — kdump / crash

Настройка kdump:
  1. Резервирование памяти: crashkernel=512M в /proc/cmdline
  2. Установка: apt install linux-crashdump (Debian)
  3. Конфигурация: /etc/default/kdump-toolsUSE_KDUMP=1
  4. Тест: echo c > /proc/sysrq-trigger
Анализ дампа:
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/vmcore
# Внутри crash:
> bt # backtrace всех процессов
> ps # список процессов
> log # dmesg на момент падения
> rd 0xffff888100000000 10 # чтение памяти (10 quadwords)
> struct task_struct.task_struct ffff888100000000

🔍 Для symbol resolution: установите linux-image-$(uname -r)-dbg или соберите ядро с CONFIG_DEBUG_INFO=y.


18. Контейнеры — OCI-стек

18.1 Спецификации

  • OCI Runtime Spec — формат config.json и runtime.json
  • OCI Image Spec — формат образов (manifest.json, layer.tar, index.json)
  • CRI (Container Runtime Interface) — gRPC-интерфейс для kubelet (containerd, CRI-O)

18.2 Инструменты

ИнструментНазначениеКоманда-пример
runcСсылочная реализация OCI runtimerunc run mycontainer
crunАльтернатива на C (меньше памяти, поддержка cgroups v2)crun run mycontainer
podmandocker-совместимый CLI без демонаpodman run -d --name web nginx
buildahСборка образов без root (от containers/image)buildah bud -t myapp .
skopeoКопирование/инспектирование образов между репозиториямиskopeo copy docker://alpine oci:alpine-local
umociРабота с OCI-образами на уровне файловой системыumoci unpack --image alpine:latest bundle/
Пример config.json (минимальный):
{
"ociVersion": "1.0.2",
"process": {
"terminal": true,
"user": { "uid": 0, "gid": 0 },
"args": ["/bin/sh"],
"env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"cwd": "/"
},
"root": { "path": "rootfs", "readonly": false },
"hostname": "container",
"mounts": [
{ "destination": "/proc", "type": "proc", "source": "proc" },
{ "destination": "/dev", "type": "tmpfs", "source": "tmpfs", "options": ["nosuid","strictatime","mode=755"] }
],
"linux": {
"namespaces": [
{ "type": "pid" },
{ "type": "network" },
{ "type": "mount" },
{ "type": "uts" },
{ "type": "ipc" }
],
"resources": {
"devices": [
{ "allow": false, "access": "rwm" },
{ "allow": true, "type": "c", "major": 1, "minor": 3, "access": "rwm" }
]
}
}
}

18.3 containerd — runtime для Kubernetes

  • ctr — низкоуровневый CLI
  • nerdctldocker-совместимый CLI для containerd
  • CRI plugin/etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri"]
Настройка пула образов:
[plugins."io.containerd.snapshotter.v1.devmapper"]
pool_name = "container-thinpool"
root_path = ""
base_image_size = "10GB"
discard_blocks = true

💡 devmapper snapshotter предпочтителен для production (вместо overlayfs на shared FS).


19. eBPF — расширяемость ядра без изменения кода

19.1 Типы программ eBPF

ТипХукПримеры использования
BPF_PROG_TYPE_SOCKET_FILTERrecvmsg, sendmsgФильтрация пакетов в userspace (как SO_ATTACH_BPF)
BPF_PROG_TYPE_KPROBEkprobe, kretprobeТрассировка функций ядра (например, tcp_sendmsg)
BPF_PROG_TYPE_TRACEPOINTТрейспоинты (sched:sched_process_exec)Стабильные точки трассировки
BPF_PROG_TYPE_XDPПриём пакета на сетевом драйвереФильтрация/перенаправление до стека (высокая производительность)
BPF_PROG_TYPE_SCHED_CLStc classifierМаркировка/фильтрация в tc
BPF_PROG_TYPE_CGROUP_SKBВход/выход из cgroupКонтроль трафика на уровне cgroup
BPF_PROG_TYPE_CGROUP_SOCKСоздание сокета в cgroupРешение allow/deny на этапе socket(), connect()
BPF_PROG_TYPE_LSM (5.7+)Хуки безопасности (SELinux/AppArmor)Дополнительные проверки доступа
BPF_PROG_TYPE_STRUCT_OPS (5.6+)Замена операций (например, TCP congestion control)Пользовательские алгоритмы

19.2 Инструменты

ИнструментНазначение
bpftoolИнтроспекция: bpftool prog show, bpftool map dump id 123
bpftraceСкриптовый язык для трассировки (DTrace-подобный)
bccНабор утилит (opensnoop, execsnoop, tcplife, biolatency) + Python API
libbpfC-библиотека для загрузки программ (рекомендована вместо BCC)
cilium/ebpfGo-библиотека для eBPF
Пример bpftrace — отслеживание execve:
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s %s\n", comm, str(args->filename)); }'
Пример XDP-программы (drop всех пакетов):
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

SEC("xdp")
int xdp_drop(struct xdp_md *ctx) {
return XDP_DROP;
}

char _license[] SEC("license") = "GPL";
Загрузка:
clang -target bpf -O2 -g -c drop.c -o drop.o
sudo ip link set dev eth0 xdp obj drop.o sec xdp

⚠️ Для XDP требуется драйвер с поддержкой (veth, ixgbe, i40e, mlx5, nfp).

19.3 Maps — обмен данными между eBPF и userspace

Тип mapОсобенности
BPF_MAP_TYPE_HASHКлюч → значение (например, PID → timestamp)
BPF_MAP_TYPE_PERCPU_HASHХеш по CPU (для агрегации)
BPF_MAP_TYPE_ARRAYИндекс → значение (фиксированный размер)
BPF_MAP_TYPE_PERF_EVENT_ARRAYПередача событий в ring buffer (perf)
BPF_MAP_TYPE_RINGBUF (5.8+)Новый ring buffer (меньше overhead)
BPF_MAP_TYPE_LPM_TRIELongest Prefix Match (для IP-диапазонов)

Пример использования в libbpf:

struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 10240);
__type(key, __u32); // PID
__type(value, __u64); // timestamp
} exec_start SEC(".maps");

20. Автоматизация развёртывания

20.1 cloud-init — инициализация в облаке

Фазы: init-localinitconfigfinal

Пример user-data:
#cloud-config
users:
- name: deploy
groups: sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2E... deploy@workstation

package_upgrade: true
packages:
- nginx
- python3-pip

runcmd:
- systemctl enable --now nginx

write_files:
- path: /etc/nginx/sites-available/app
content: |
server { listen 80; location / { proxy_pass http://localhost:8000; } }

📁 Источники: nocloud (CDROM/ISO), ConfigDrive, OpenStack metadata, AWS EC2.

20.2 ignition — инициализация для CoreOS/RHCOS/Fedora CoreOS

Формат: JSON (строго типизированный), применяется один раз при первой загрузке.

Пример:
{
"ignition": { "version": "3.4.0" },
"passwd": {
"users": [{
"name": "core",
"sshAuthorizedKeys": ["ssh-rsa AAAAB3..."]
}]
},
"storage": {
"files": [{
"path": "/etc/hostname",
"contents": { "source": "data:,myhost" },
"mode": 420
}]
},
"systemd": {
"units": [{
"name": "nginx.service",
"enabled": true,
"contents": "[Service]\nExecStart=/usr/sbin/nginx -g 'daemon off;'\n[Install]\nWantedBy=multi-user.target"
}]
}
}

🔐 Поддержка LUKS, RAID, Btrfs, SELinux relabeling на этапе инициализации.

20.3 systemd-утилиты для автоматизации

УтилитаНазначениеПример
systemd-sysusersСоздание системных пользователей из /usr/lib/sysusers.d/*.confu deploy - "Deployment user" - -
systemd-tmpfilesУправление временными файлами/каталогамиd /run/app 0755 deploy deploy -
systemd-firstbootНастройка hostname, timezone, locale при первой загрузкеsystemd-firstboot --hostname=myhost --timezone=Europe/Moscow
systemd-repart (249+)Динамическое изменение разделов на загрузке/usr/lib/systemd/systemd-repart --dry-run=no /dev/sda

Формат /usr/lib/tmpfiles.d/app.conf:

d /run/app     0755 deploy deploy -
f /var/log/app.log 0644 root root -
L /var/lib/app/current - - - - ../releases/20241121

💡 Используется в immutable OS (CoreOS, Flatcar) для идемпотентной инициализации.


📘 systemd и journald

21. systemd — архитектура и углублённое управление

21.1 Типы юнитов и их ключевые параметры

Тип юнитаРасширениеКлючевые секции и параметрыПримечания
service.service[Service] Type= (simple, forking, oneshot, notify, dbus, exec, idle) ExecStart=, ExecStartPre=, ExecStartPost= Restart= (no, always, on-success, on-failure, on-abnormal, on-watchdog, on-abort) RestartSec= TimeoutStartSec=, TimeoutStopSec= KillMode= (control-group, process, mixed, none) KillSignal= SendSIGKILL= SendSIGHUP= WorkingDirectory= RootDirectory= User= Group= SupplementaryGroups= Nice= CPUSchedulingPolicy= (other, batch, idle, fifo, rr) CPUSchedulingPriority= IOSchedulingClass= (none, realtime, best-effort, idle) IOSchedulingPriority=Type=notify требует sd_notify(3) в приложении Restart=on-failure + StartLimitIntervalSec=, StartLimitBurst= — защита от флаппинга
socket.socket[Socket] ListenStream=, ListenDatagram=, ListenSequentialPacket= ListenFIFO=, ListenSpecial= ListenNetlink= ListenMessageQueue= Accept= (yes/no) MaxConnections= TimeoutSec= DirectoryMode= SocketMode= SocketUser= SocketGroup=Активация по сокету (socket activation). При Accept=yes — создаётся transient-сервис на каждое соединение
timer.timer[Timer] OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec= OnCalendar= (например, Mon..Fri *-*-* 09:00:00) AccuracySec= RandomizedDelaySec= Persistent=Замена cron для системных задач. Persistent=yes — выполнить пропущенные события после простоя
path.path[Path] PathExists=, PathExistsGlob= PathChanged=, PathModified= DirectoryNotEmpty=Активация при изменении ФС (например, inotify-триггеры)
device.deviceАвтогенерируется из udevИмя — из DEVPATH, замена /- (например, dev-sda.device)
mount.mountИмя — путь с заменой /- (например, mnt-data.mount) What= Where= Type= Options=Активируется как юнит; systemctl start mnt-data.mountmount /mnt/data
automount.automount[Automount] Where= TimeoutIdleSec=Автомонтирование по обращению (аналог autofs)
target.target[Install] WantedBy= RequiredBy=Группировка юнитов (аналог runlevel: multi-user.target, graphical.target)
slice.slice[Slice] — пусто [CPUAccounting], [MemoryAccounting], [IOAccounting]Иерархия cgroups v2: machine.slice, system.slice, user.slice
scope.scopeСоздаётся динамически (systemd-run --scope)Для внешних процессов (например, user@1000.service)

21.2 Управление зависимостями

ДирективаСекцияЭффект
Requires=[Unit]Запускать зависимость; ошибка → fail юнита
Wants=[Unit]Запускать зависимость; ошибка → игнор
Requisite=[Unit]Проверка перед запуском (если недоступна — fail без попытки запуска)
BindsTo=[Unit]Останавливать юнит при остановке зависимости
PartOf=[Unit]Группировка для systemctl stop (но не влияет на порядок)
After= / Before=[Unit]Порядок запуска/остановки (не подразумевает Requires)
Conflicts=[Unit]Взаимоисключающие юниты
Upholds=[Unit]Перезапускать зависимость, если она упала (но не при старте)

💡 Правило: Wants= + After= — стандартный паттерн для нестрогих зависимостей.

21.3 Изоляция и безопасность в [Service]

ПараметрБезопасное значениеЭффект
PrivateTmp=yesОтдельный /tmp, /var/tmp
PrivateDevices=yesПустой /dev (только null, zero, full, random, urandom, tty, ptmx)
ProtectSystem=strict/usr, /boot, /etcro; /noexec, nodev, nosuid
ProtectHome=read-only / tmpfs/home, /root, /run/userro или изолированный tmpfs
NoNewPrivileges=yesЗапрет setuid, setgid, capabilities, user namespaces
RestrictSUIDSGID=yesБлокировка создания setuid/setgid файлов
RestrictRealtime=yesЗапрет SCHED_FIFO, SCHED_RR
RestrictNamespaces=yes / mount:net:pidОграничение создания namespace
LockPersonality=yesЗапрет personality() syscall (эмуляция других ОС)
MemoryDenyWriteExecute=yesЗапрет одновременного PROT_WRITE | PROT_EXEC
SystemCallFilter=@system-service + ~@privilegedФильтрация syscalls (см. Часть 3)
SystemCallArchitectures=nativeЗапрет вызовов для других архитектур (multilib)
IPAddressAllow= / IPAddressDeny=10.0.0.0/8 127.0.0.1 ::1Фильтрация на уровне cgroup v2 (требует IPAccounting=yes)
DeviceAllow=char-rtc r, block-sda rwКонтроль доступа к /dev/* (аналог cgroups v1 devices)
Пример безопасного сервиса:
[Service]
Type=notify
User=app
Group=app
DynamicUser=yes
ProtectSystem=strict
ProtectHome=read-only
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
RestrictSUIDSGID=yes
RestrictRealtime=yes
RestrictNamespaces=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes
SystemCallFilter=@system-service @network-io
SystemCallArchitectures=native
IPAddressAllow=10.0.0.0/8 127.0.0.1
DeviceAllow=char-rtc r

DynamicUser=yes — создаёт ephemeral UID/GID вне /etc/passwd, автоматически удаляется при остановке.

21.4 Уведомления и интеграция

МеханизмОписаниеПример (C)
sd_notify(3)Отправка состояния через AF_UNIX сокет ($NOTIFY_SOCKET)sd_notify(0, "READY=1\nSTATUS=Running");
sd_notifyf(3)Форматированная отправкаsd_notifyf(0, "STATUS=Processing %d items", count);
sd_pid_notify(3)Уведомление от другого PID
sd_watchdog_enabled(3)Поддержка watchdog (WatchdogSec=)uint64_t usec; sd_watchdog_enabled(0, &usec); sd_notify(0, "WATCHDOG=1");
sd_booted(3)Проверка, запущен ли systemd
Параметры юнита:
[Service]
Type=notify
NotifyAccess=main
WatchdogSec=30s

📡 systemd ждёт READY=1 в течение TimeoutStartSec (по умолчанию 90s), иначе — timeout.

21.5 Динамические юниты и transient units

КомандаПримерЭффект
systemd-runsystemd-run --uid=1000 --slice=machine.slice --property=After=network-online.target sleep 3600Создаёт transient .service
busctl callbusctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager StartTransientUnit "ssa(sv)a(sa(sv))" "myapp.service" "fail" 2 "ExecStart" 1 "/bin/sleep" 3 "/bin/sleep" "60" "Type" "s" "oneshot" 0Прямой вызов D-Bus API
systemd-analyze dumpВывод всех юнитов и их состояний (для отладки)

22. journald — структурированное логирование

22.1 Архитектура

  • systemd-journald — собирает логи из:
    • stdout/stderr сервисов
    • kmsg (через /dev/kmsg)
    • syslog (через /run/systemd/journal/syslog)
    • native API (sd_journal_send())
  • Хранение:
    • /run/log/journal/ — volatile (RAM)
    • /var/log/journal/ — persistent (если Storage=persistent в /etc/systemd/journald.conf)
  • Формат: binary, индексированный, сжатый (LZ4/XZ)

22.2 Конфигурация (/etc/systemd/journald.conf)

ПараметрЗначениеЭффект
Storage=volatile, persistent, auto, noneКуда писать логи
Compress=yes/noСжатие записей
Seal=yes/noКриптографическая привязка записей (требует TPM2 или ключа)
SplitMode=uid, login, noneРазделение журналов по пользователям
RateLimitIntervalSec=30sИнтервал rate limiting
RateLimitBurst=10000Макс. записей за интервал
MaxRetentionSec=1monthАвтоочистка по времени
MaxFileSec=1dayМакс. время жизни одного файла
SystemMaxUse=1GМакс. общий размер
RuntimeMaxUse=100MМакс. размер в RAM

22.3 Структурированные поля

Каждая запись содержит ключ=значение в UTF-8.

ПолеИсточникПример
MESSAGE=stdout, sd_journal_send()"Server started on port 8080"
PRIORITY=syslog level / sd_journal_priority()6 (info)
SYSLOG_IDENTIFIER=argv[0] или setproctitle"nginx"
SYSLOG_PID=PID процесса12345
_PID=, _UID=, _GID=Ядро12345, 33, 33
_COMM=, _EXE=, _CMDLINE=/proc/<pid>/"nginx", "/usr/sbin/nginx", "nginx: worker process"
_SYSTEMD_UNIT=, _SYSTEMD_SLICE=, _SYSTEMD_CGROUP=cgroup"nginx.service", "system.slice", "/system.slice/nginx.service"
_BOOT_ID=UUID загрузки"7d4d3e5a-..."
_MACHINE_ID=/etc/machine-id"a1b2c3d4-..."
_HOSTNAME=gethostname()"web01"
CODE_FILE=, CODE_LINE=, CODE_FUNC=sd_journal_send()"main.c", 42, "start_server"
ERRNO=errno13 (EACCES)
MESSAGE_ID=UUID события"f1a2b3c4-..." (для каталогизации)
Пример отправки структурированного лога (C):
#include <systemd/sd-journal.h>
sd_journal_send(
"MESSAGE=File processed: %s", path,
"PRIORITY=%i", LOG_INFO,
"FILE_PATH=%s", path,
"BYTES_READ=%zu", size,
"ERRNO=%i", errno,
"CODE_FILE=%s", __FILE__,
"CODE_LINE=%i", __LINE__,
"CODE_FUNC=%s", __func__,
NULL
);

22.4 Утилиты анализа

КомандаПримерОписание
journalctljournalctl -u nginx.service -fПросмотр логов
journalctl --since "2024-11-20 09:00:00" --until "2024-11-20 17:00:00"По времени
journalctl _PID=12345По PID
journalctl MESSAGE_ID=f1a2b3c4-...По ID события
journalctl -o json-prettyВывод в JSON
journalctl --disk-usageРазмер журналов
journalctl --vacuum-time=7dОчистка старше 7 дней
systemd-catalogsystemd-catalog query f1a2b3c4-...Получение описания события из каталога
systemd-catalog updateОбновление локального каталога (/usr/lib/systemd/catalog/*.catalog)
Создание каталога событий (/usr/lib/systemd/catalog/myapp.catalog):
f1a2b3c4-abcd-1234-5678-0123456789ab
File processed successfully.
The application has successfully processed the input file.

📚 systemd-catalog позволяет локализовать и документировать события — аналог Event Log в Windows.

22.5 Шифрование журналов (250+)

Требует TPM2 или внешнего ключа.

# /etc/systemd/journald.conf.d/encrypt.conf
[Journal]
Seal=yes
# Генерация ключа (если нет TPM)
systemd-creds encrypt --name=journal.secret --setup --no-pager
# Включение sealing
systemctl restart systemd-journald

🔐 Записи подписываются HMAC-SHA256, проверяются при чтении. Защищает от подмены логов.


23. Интеграция systemd с другими системами

КомпонентИнтеграция
logindУправление сессиями: systemd-logind создаёт user@.service, session-*.scope, выдаёт XDG_RUNTIME_DIR, cgroup для пользователя
resolvedsystemd-resolved — DNS stub listener (127.0.0.53), кэширование, DNSSEC, mDNS
networkdsystemd-networkd — конфигурация сети (.network, .netdev, .link), DHCP, static, bridge, VLAN
timesyncdsystemd-timesyncd — SNTP-клиент (базовая синхронизация)
homedsystemd-homed — управление пользователями в зашифрованных home-директориях (~/.home)
portabledsystemd-portabled — импорт/экспорт portable-сервисов (.raw образы)
machinedsystemd-machined — отслеживание ВМ/контейнеров (machinectl list)
Пример .network файла:
[Match]
Name=enp1s0

[Network]
DHCP=yes
DNS=8.8.8.8
Domains=~.

[DHCP]
UseDNS=false
RouteMetric=100

💡 systemd-networkd совместим с NetworkManager (через unmanaged-devices), но не должен управлять одним интерфейсом одновременно.


📘 Диагностика, профилирование, анализ производительности

24. Трассировка системных вызовов и библиотек

24.1 strace — системные вызовы

Ключевые опции:
ОпцияЭффектПример
-e trace=%desc,%file,%process,%signal,%ipcФильтрация по категориямstrace -e trace=openat,connect -p 1234
-e trace=/regex/Фильтр по регулярному выражениюstrace -e trace=/^f/fork, fstat, fcntl
-e status=failedТолько завершившиеся с ошибкойstrace -e status=failed curl example.com
-kПоказать стек вызовов (требует -f и CONFIG_STACKTRACE)strace -k -e openat cat /etc/passwd
-TВремя выполнения каждого вызова
-cСводная статистика (syscalls, errors, time)
-o fileЗапись в файл
-ffРаздельные файлы для каждого потока/процессаstrace -ff -o trace ./apptrace.<pid>
-s NМакс. длина строк (по умолчанию 32)strace -s 256 -e write ...
-yyДекодирование дескрипторов (например, socket:[12345]TCP localhost:53)strace -yy -e connect ...
Пример: отладка 403 в веб-сервере
strace -f -e trace=openat,stat,fstat,access -s 256 -o nginx.strace nginx -g 'daemon off;'
# Поиск:
grep -E 'openat.*ENOENT|access.*EACCES' nginx.strace

⚠️ strace замедляет программу (×10–100). Не использовать в продакшене без изоляции.

24.2 ltrace — вызовы библиотек (libc, libm, libpthread)

ОпцияЭффект
-e "malloc@libc.so.6"Фильтр по символу и библиотеке
-l libssl.so.3Только вызовы из указанной библиотеки
-CДекорирование имён C++ (demangling)
-n 4Отступ для вложенности вызовов
-cСводка по вызовам (кол-во, время)
Пример: анализ использования malloc
ltrace -e malloc,calloc,realloc,free -c ./app

ltrace не работает с static-линкованными бинарниками и PIE без отладочных символов.


25. perf — профилирование ядра и userspace

Архитектура: PMU (Performance Monitoring Unit) → ring bufferperf.dataperf report.

25.1 Базовые команды

КомандаОписание
perf listСписок доступных событий (hardware, software, tracepoint, dynamic)
perf stat -p 1234Счётчики: instructions, cycles, branches, branch-misses, cache-references, cache-misses
perf record -g --call-graph dwarf -p 1234Запись стеков (DWARF для userspace, fp для frame pointers)
perf report --no-childrenОтчёт без агрегации потомков
perf topАналог top в реальном времени
perf scriptВывод событий в текстовом виде (для обработки скриптами)
Типы событий:
КатегорияПримеры
Hardwarecycles, instructions, cache-references, cache-misses, branch-instructions, branch-misses
Softwarecpu-clock, task-clock, page-faults, context-switches, cpu-migrations
Tracepointsched:sched_switch, syscalls:sys_enter_openat, block:block_rq_issue, net:netif_receive_skb
DynamicrNNN (raw MSR), mem:0xaddr (load/store latency), kmem:kmalloc

25.2 Продвинутые сценарии

Оценка эффективности CPU:
perf stat -e \
cycles,instructions,\
branches,branch-misses,\
cache-references,cache-misses,\
stalled-cycles-frontend,stalled-cycles-backend \
--timeout 10000 ./app

IPC = instructions / cycles (цель: >1.0 для compute-bound), branch-miss-rate < 1%.

Проблемы с NUMA:
perf c2c record -p 1234  # cache-to-cache transfers
perf c2c report

→ Показывает LLC Misses, Remote HITM, LLC Local/Remote.

Мониторинг памяти:
perf mem record -p 1234
perf mem report --stdio

load, store, load-hit, load-miss, store-hit, store-miss.

Трассировка ядра:
perf probe 'tcp_sendmsg size'  # добавить kprobe
perf record -e probe:tcp_sendmsg -aR sleep 10
perf script

💡 Для perf требуется CONFIG_PERF_EVENTS=y, CONFIG_KPROBE_EVENTS=y, CONFIG_UPROBE_EVENTS=y.


26. ftrace — встроенная трассировка ядра

Работает через debugfs: /sys/kernel/debug/tracing/.

Основные файлы:

ФайлНазначение
available_tracersnop, function, function_graph, blk, hwlat, irqsoff, preemptoff, wakeup
current_tracerТекущий трассер
traceВывод трассировки
trace_pipeПотоковый вывод (не буферизованный)
set_ftrace_filterФильтр функций (tcp_*, ext4_*)
set_ftrace_notraceИсключения
tracing_on1/0 — вкл/выкл сбор
optionsФлаги: function-trace, latency-format, sleep-time, stacktrace
Пример: анализ задержек в планировщике
echo preemptoff > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
sleep 5
echo 0 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace

→ Покажет максимальное время без preemption.

Граф вызовов:
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo 'ext4_*' > /sys/kernel/debug/tracing/set_ftrace_filter
echo 1 > /sys/kernel/debug/tracing/tracing_on
# Выполнить операцию
cat /sys/kernel/debug/tracing/trace

📌 ftrace работает без загрузки модулей, минимальный overhead. Подходит для production с осторожностью.


27. blktrace и bpftrace — специализированная диагностика

27.1 blktrace — трассировка блочного I/O

УтилитаНазначение
blktrace -d /dev/sda -o - | blkparse -i -Потоковый разбор
btt -i sda.blktrace.binАнализ временных характеристик (queue, service time)
seekwatcher -t sda.blktrace.bin -o seekmap.pngВизуализация seek-паттернов
События:
  • Q — queued
  • G — get request
  • M — remap
  • I — inserted
  • D — issued to driver
  • C — completed

D→C = service time; Q→G = queue wait.

27.2 bpftrace — однострочники для диагностики

Группировка по категориям:
КатегорияКомандаОписание
Файловая системаbpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'Все openat
bpftrace -e 'tracepoint:syscalls:sys_exit_openat /args->ret < 0/ { printf("%s %s → %d\n", comm, str(args->filename), args->ret); }'Ошибки открытия
bpftrace -e 'kprobe:vfs_read { @bytes = hist(args->count); }'Распределение размеров чтения
Сетьbpftrace -e 'tracepoint:syscalls:sys_enter_connect { printf("%s → %s:%d\n", comm, ntop(args->addr), args->port); }'Исходящие соединения
bpftrace -e 'kprobe:tcp_sendmsg { @size = hist(args->size); }'Размеры отправляемых TCP-пакетов
bpftrace -e 'kprobe:tcp_rcv_established { @inflight = hist(args->tp->snd_nxt - args->tp->snd_una); }'In-flight bytes (congestion window proxy)
Памятьbpftrace -e 'kprobe:__alloc_pages_nodemask { @order = hist(args->order); }'Распределение order при аллокации страниц
bpftrace -e 'kprobe:kmem_cache_alloc { @size = hist((uint64)args->size); }'Размеры SLAB-аллокаций
Планировщикbpftrace -e 'tracepoint:sched:sched_switch { @quantum[prev->pid] = nsecs - @start[prev->pid]; @start[prev->pid] = nsecs; }'Время кванта процесса
bpftrace -e 'tracepoint:sched:sched_wakeup { @latency = hist(nsecs - args->target->last_sleep); }'Время пробуждения
Производительностьbpftrace -e 'profile:hz:99 { @[kstack] = count(); }'CPU profiling (99 Hz)
bpftrace -e 'tracepoint:syscalls:sys_exit_* /args->ret < 0/ { @[comm, probe] = count(); }'ТОП-ошибки по syscall

bpftrace компилирует в eBPF на лету, минимальный overhead. Подходит для production при аккуратном использовании.


28. Анализ дампов и отладка

28.1 Сбор дампов

СценарийКомандаФормат
Процессgcore -o core.12345 12345ELF core dump
kill -SIGQUIT 12345 (если ulimit -c unlimited)
Ядроecho c > /proc/sysrq-triggercrashkernel=)vmcore
Временная точкаrr record ./appRecord & Replay (deterministic)
Снапшот памятиcryo save 12345 /tmp/snap.cryoСостояние процесса (через ptrace + memfd)

28.2 Анализ в gdb

Основные команды:
КомандаЭффект
(gdb) bt fullBacktrace со значениями локальных переменных
(gdb) info registersРегистры CPU
(gdb) disassemble $pc,+64Дизассемблирование вокруг PC
(gdb) x/10gx $rspПросмотр стека (10 quadwords)
(gdb) thread apply all btBacktrace всех потоков
(gdb) set pagination offОтключить постраничный вывод
(gdb) python print(gdb.history(10))Доступ к Python API
Автоматизация:
# ~/.gdbinit
set backtrace past-main on
set print pretty on
set print array on
set print array-indexes on
define mybt
thread apply all bt full
info registers
info sharedlibrary
end

28.3 rr — record & replay

rr record ./app          # запись
rr replay # воспроизведение с возможностью rewind
(gdb) reverse-step # шаг назад
(gdb) reverse-continue # до точки останова назад

🎯 Идеален для нестабильных багов (race conditions, use-after-free).

28.4 cryo — snapshotting без остановки

cryo save 12345 /tmp/snap.cryo  # сохранить
cryo restore /tmp/snap.cryo # восстановить (в новом PID)

🔁 Поддерживает fork, threads, mmap, vDSO, но не поддерживает ptrace, inotify, epoll, netlink.